home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / shells / scsh-0.4 / scsh-0 / scsh-0.4.2 / main.c < prev    next >
Text File  |  1995-10-13  |  5KB  |  199 lines

  1. /* Copyright (c) 1993, 1994 Richard Kelsey and Jonathan Rees.
  2.    See file COPYING. */
  3.  
  4. /* Modified by Olin Shivers.
  5. ****************************
  6. ** New flag set:
  7. **   \    <fname>        meta-arg (a single backslash char)
  8. **   -i <image>        terminates arg scanning (necessary for scripts)
  9. */
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13.  
  14. /* I bumped this up from 1.5 Mcell because the debugging info put us over
  15. ** the top. -Olin
  16. */
  17. #if !defined(DEFAULT_HEAP_SIZE)
  18. /* 2.5 megacell = 10 megabytes (5 meg per semispace) */
  19. #define DEFAULT_HEAP_SIZE 2500000L
  20. #endif
  21.  
  22. #if !defined(DEFAULT_STACK_SIZE)
  23. /* 2500 cells = 10000 bytes */
  24. #define DEFAULT_STACK_SIZE 2500L
  25. #endif
  26.  
  27. #if defined(STATIC_AREAS)
  28. #define DEFAULT_IMAGE_NAME NULL
  29. #else
  30.  
  31. /* DEFAULT_IMAGE_NAME should be defined using the -D switch to cc. */
  32. #if !defined(DEFAULT_IMAGE_NAME)
  33. #define DEFAULT_IMAGE_NAME "s48.image"
  34. #endif
  35.  
  36. #endif /* STATIC_AREAS */
  37.  
  38. #define streq(a,b) (strcmp((a),(b))==0)
  39.  
  40. char *object_file;   /* specified via a command line argument */
  41. char *reloc_file;    /* dynamic loading will set this */
  42.  
  43. static char *prog_name;
  44.  
  45. static void usage(void)
  46. {
  47.   fprintf(stderr, "Usage: %s [meta-arg] [vm-option+] [end-option scheme-args]\n"
  48.           "meta-arg:    \\ <script file name>\n"
  49.           "\n"
  50.               "vm-option: -h <total heap size in words>\n"
  51.               "           -s <stack size in words>\n"
  52.               "           -o <object file name>\n"
  53.           "\n"
  54.               "end-option: -i <image file name>\n"
  55.               "            -- (Terminates vm args.)\n"
  56.               "            -a (Terminates vm args. Obsolete.)\n",
  57.       prog_name);
  58. }
  59.  
  60. static void bad_args(void) { usage(); exit(1); }
  61.  
  62. main(argc, argv)
  63.      int argc; char **argv;
  64. {
  65.   extern char **process_meta_arg(char **);
  66.   char *image_name = DEFAULT_IMAGE_NAME;
  67.   long heap_size = DEFAULT_HEAP_SIZE;    /* in numbers of cells */
  68.   long stack_size = DEFAULT_STACK_SIZE;  /* in numbers of cells */
  69.   char **argp;
  70.   long return_value;
  71.   extern void sysdep_init();
  72.   extern long required_init_space();
  73.   extern void initialize_vm();
  74.   extern long call_startup_procedure();
  75.   extern long check_image_header();
  76.   extern long read_image();
  77.   extern void register_static_areas();
  78.   void *heap, *stack;
  79.   long required_heap_size, startup_proc;
  80.  
  81. #if defined(STATIC_AREAS)
  82.   extern long entry;
  83.   extern long p_count, *p_areas[], p_sizes[];
  84.   extern long i_count, *i_areas[], i_sizes[];
  85. #endif
  86.  
  87.   long vm_argc = 0;
  88.   prog_name = *argv++;        /* Save program name. */
  89.  
  90.   object_file = reloc_file = NULL;
  91.  
  92.   /* Handle an initial \ <fname> meta-arg expansion. */
  93.   while ( *argv && streq(*argv, "\\") ) {
  94.       argv++;
  95.       if( !*argv ) bad_args();    /* die */
  96.       argv = process_meta_arg(argv);
  97.       if( !argv ) {
  98.       fprintf(stderr, "%s: \\ <fname> expansion failed.\n",
  99.           prog_name);
  100.       exit(1);
  101.       }
  102.       }
  103.  
  104.   for (; *argv; argv++)
  105.       if( argv[0][0] != '-' )
  106.       bad_args(); /* die */
  107.       else
  108.       switch (argv[0][1]) {
  109.       default:
  110.           bad_args(); /* die */
  111.           break;
  112.  
  113.       case 'h': /* heapsize */
  114.         argv++;
  115.         if( !*argv ) bad_args(); /* die */
  116.         heap_size = atoi(*argv);
  117.         if( heap_size <= 0 ) bad_args();
  118.         break;
  119.  
  120.       case 's':
  121.           argv++;
  122.           if( !*argv ) bad_args(); /* die */
  123.           stack_size = atoi(*argv);
  124.           if (stack_size <= 0) bad_args();
  125.           break;
  126.  
  127.       case 'o': /* object file */
  128.         argv++;
  129.         if( !*argv ) bad_args(); /* die */
  130.         object_file = *argv;
  131.         break;
  132.  
  133.       /* These switches terminate arg scanning. */
  134.       case 'i':
  135.         argv++;
  136.         if( !*argv ) bad_args(); /* die */
  137.         image_name = *argv++;
  138.         goto args_done;
  139.  
  140.       case '-':
  141.       case 'a':
  142.         argv++;
  143.         goto args_done;
  144.         }
  145.  
  146.  args_done:
  147.   for(argc=0, argp=argv; *argp; argc++, argp++); /* Recompute argc. */
  148.  
  149.   sysdep_init();
  150.   scheme48_init();
  151.  
  152.   if (image_name == NULL)
  153.     required_heap_size = 0;
  154.   else {
  155.     /* check_image_header returns number of bytes; required_heap_size
  156.        is number of cells. */
  157.     required_heap_size = check_image_header(image_name) >> 2;
  158.     if (-1 == required_heap_size) {
  159.       fprintf(stderr, "image file %s is unusable\n", image_name);
  160.       return 1; }
  161.   }
  162.  
  163.   required_heap_size += required_init_space(argv, vm_argc);
  164.   
  165.   /* two semi-spaces, plus we want some room to maneuver */
  166.   if (heap_size < 4 * required_heap_size) {
  167.     fprintf(stderr, "heap size %ld cells is too small, using %ld cells\n",
  168.         heap_size, 4 * required_heap_size);
  169.     heap_size = 4 * required_heap_size; }
  170.  
  171.   heap = (void *) malloc(heap_size * sizeof(long));
  172.   stack = (void *) malloc(stack_size * sizeof(long));
  173.     
  174.   if (!heap || !stack) {
  175.     fprintf(stderr, "system is out of memory\n");
  176.     return 1; }
  177.  
  178.   initialize_vm(heap, heap_size, stack, stack_size);
  179.  
  180. #if defined(STATIC_AREAS)
  181.   if (image_name == NULL) {
  182.     register_static_areas(p_count, p_areas, p_sizes,
  183.               i_count, i_areas, i_sizes);
  184.     startup_proc = entry;
  185.   } else
  186.     startup_proc = read_image(image_name, 0L);
  187. #else
  188.   startup_proc = read_image(image_name, 0L);
  189. #endif
  190.  
  191.   return_value = call_startup_procedure(startup_proc, argv, argc);
  192.  
  193.   if (reloc_file != NULL)
  194.     if (0 != unlink(reloc_file))
  195.       fprintf(stderr, "unable to delete file %s\n", reloc_file);
  196.  
  197.   return(return_value);
  198. }
  199.